package com.xwj.action;

import com.xwj.domain.Order;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

/**
 * @author xwj
 * @date 2020/11/13
 */
@LocalTCC
public interface OrderTccAction {
    /**
     * 创建订单：一阶段
     * 初步操作 Try：完成所有业务检查，预留必须的业务资源
     *
     * @param businessActionContext
     * @param order
     * @return
     */
    @TwoPhaseBusinessAction(name = "createOrderTccAction", commitMethod = "commitCreateOrder", rollbackMethod = "rollbackCreateOrder")
    boolean createOrderTccAction(BusinessActionContext businessActionContext, @BusinessActionContextParameter(paramName = "order") Order order);

    /**
     * 创建订单：二阶段提交
     * 确认操作 Confirm：真正执行的业务逻辑，不做任何业务检查，只使用 Try 阶段预留的业务资源。
     * 因此，只要 Try 操作成功，Confirm 必须能成功。
     * 另外，Confirm 操作需满足幂等性，保证一笔分布式事务能且只能成功一次。
     *
     * @param businessActionContext
     * @return
     */
    boolean commitCreateOrder(BusinessActionContext businessActionContext);

    /**
     * 创建订单：二阶段回滚
     * 取消操作 Cancel：释放 Try 阶段预留的业务资源。同样的，Cancel 操作也需要满足幂等性。
     *
     * @param businessActionContext
     * @return
     */
    boolean rollbackCreateOrder(BusinessActionContext businessActionContext);
}
